package javathread;

import java.util.concurrent.*;

/**
 * @auther yangdong
 * @create 2020-04-12
 * 背景：经常创建和销毁、使用量特别大的资源，比如并发情况下的线程，
 * 对性能影响很大。
 *  思路：提前创建好多个线程，放入线程池中，使用时直接获取，使用完
 * 放回池中。可以避免频繁创建销毁、实现重复利用。类似生活中的公共交
 * 通工具。
 *  好处：
 *  提高响应速度（减少了创建新线程的时间）
 *  降低资源消耗（重复利用线程池中线程，不需要每次都创建）
 *  便于线程管理
 *  corePoolSize：核心池的大小
 *  maximumPoolSize：最大线程数
 *  keepAliveTime：线程没有任务时最多保持多长时间后会终止
 *  …
 *  JDK 5.0起提供了线程池相关API：ExecutorService 和 Executors
 *  ExecutorService：真正的线程池接口。常见子类ThreadPoolExecutor
 *  void execute(Runnable command) ：执行任务/命令，没有返回值，一般用来执行
 * Runnable
 *  <T> Future<T> submit(Callable<T> task)：执行任务，有返回值，一般又来执行
 * Callable
 *  void shutdown() ：关闭连接池
 *  Executors：工具类、线程池的工厂类，用于创建并返回不同类型的线程池
 *  Executors.newCachedThreadPool()：创建一个可根据需要创建新线程的线程池
 *  Executors.newFixedThreadPool(n); 创建一个可重用固定线程数的线程池
 *  Executors.newSingleThreadExecutor() ：创建一个只有一个线程的线程池
 *  Executors.newScheduledThreadPool(n)：创建一个线程池，它可安排在给定延迟后运
 * 行命令或者定期地执行。
 */
public class ThreadPool {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService service = Executors.newFixedThreadPool(10);
        ThreadPoolExecutor service1=(ThreadPoolExecutor)service;
        service1.setMaximumPoolSize(10);
        service1.execute(new NumThread());
        service1.execute(new NumThread1());
        Future submit = service1.submit(new NumThread2());
        System.out.println(submit.get());
        service1.submit(new NumThread1());
        service1.shutdown();

    }
}
class NumThread implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i <100 ; i++) {
            if (i%2==0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }

        }
    }
}
class NumThread1 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i <100 ; i++) {
            if (i%2!=0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }

        }
    }
}
class NumThread2 implements Callable{
    int num=0;
    @Override
    public Object call() throws Exception {
        for (int i = 0; i <100 ; i++) {
            if (i%2==0){
                System.out.println(Thread.currentThread().getName()+":"+i);
            }
            num+=i;
        }
        return num;
    }
}

